CREATE OR REPLACE FUNCTION "public"."FN_NUMBER_TO_LETTER" (numero numeric)  RETURNS text
  VOLATILE
AS $dbvis$
DECLARE
    lnEntero INTEGER;
    lcRetorno TEXT;
    lnTerna INTEGER;
    lcMiles TEXT;
    lcCadena TEXT;
    lnUnidades INTEGER;
    lnDecenas INTEGER;
    lnCentenas INTEGER;
    lnFraccion INTEGER;
    lnSw INTEGER;
BEGIN
    lnEntero := FLOOR(numero)::INTEGER;--Obtenemos la parte Entera
    lnFraccion := FLOOR(((numero - lnEntero) * 100))::INTEGER;--Obtenemos la Fraccion del
    -- Monto
    lcRetorno := '';
    lnTerna := 1;
    IF lnEntero > 0 THEN
        lnSw := LENGTH(CAST(lnEntero AS VARCHAR));
        WHILE lnTerna <= lnSw
        LOOP
            -- Recorro terna por terna
            lcCadena = '';
            lnUnidades = lnEntero % 10;
            lnEntero = CAST(lnEntero/10 AS INTEGER);
            lnDecenas = lnEntero % 10;
            lnEntero = CAST(lnEntero/10 AS INTEGER);
            lnCentenas = lnEntero % 10;
            lnEntero = CAST(lnEntero/10 AS INTEGER);
            -- Analizo las unidades
            SELECT
                CASE
                        /* UNIDADES */
                    WHEN lnUnidades = 1
                    AND lnTerna = 1
                    THEN 'UNO ' || lcCadena
                    WHEN lnUnidades = 1
                    AND lnTerna <> 1
                    THEN 'UN ' || lcCadena
                    WHEN lnUnidades = 2
                    THEN 'DOS ' || lcCadena
                    WHEN lnUnidades = 3
                    THEN 'TRES ' || lcCadena
                    WHEN lnUnidades = 4
                    THEN 'CUATRO ' || lcCadena
                    WHEN lnUnidades = 5
                    THEN 'CINCO ' || lcCadena
                    WHEN lnUnidades = 6
                    THEN 'SEIS ' || lcCadena
                    WHEN lnUnidades = 7
                    THEN 'SIETE ' || lcCadena
                    WHEN lnUnidades = 8
                    THEN 'OCHO ' || lcCadena
                    WHEN lnUnidades = 9
                    THEN 'NUEVE ' || lcCadena
                    ELSE lcCadena
                END
            INTO
                lcCadena;

            /* UNIDADES */
            -- Analizo las decenas
            SELECT
                CASE
                        /* DECENAS */
                    WHEN lnDecenas = 1
                    THEN
                        CASE lnUnidades
                            WHEN 0
                            THEN 'DIEZ '
                            WHEN 1
                            THEN 'ONCE '
                            WHEN 2
                            THEN 'DOCE '
                            WHEN 3
                            THEN 'TRECE '
                            WHEN 4
                            THEN 'CATORCE '
                            WHEN 5
                            THEN 'QUINCE '
                            ELSE 'DIECI' || lcCadena
                        END
                    WHEN lnDecenas = 2
                    AND lnUnidades = 0
                    THEN 'VEINTE ' || lcCadena
                    WHEN lnDecenas = 2
                    AND lnUnidades <> 0
                    THEN 'VEINTI' || lcCadena
                    WHEN lnDecenas = 3
                    AND lnUnidades = 0
                    THEN 'TREINTA ' || lcCadena
                    WHEN lnDecenas = 3
                    AND lnUnidades <> 0
                    THEN 'TREINTA Y ' || lcCadena
                    WHEN lnDecenas = 4
                    AND lnUnidades = 0
                    THEN 'CUARENTA ' || lcCadena
                    WHEN lnDecenas = 4
                    AND lnUnidades <> 0
                    THEN 'CUARENTA Y ' || lcCadena
                    WHEN lnDecenas = 5
                    AND lnUnidades = 0
                    THEN 'CINCUENTA ' || lcCadena
                    WHEN lnDecenas = 5
                    AND lnUnidades <> 0
                    THEN 'CINCUENTA Y ' || lcCadena
                    WHEN lnDecenas = 6
                    AND lnUnidades = 0
                    THEN 'SESENTA ' || lcCadena
                    WHEN lnDecenas = 6
                    AND lnUnidades <> 0
                    THEN 'SESENTA Y ' || lcCadena
                    WHEN lnDecenas = 7
                    AND lnUnidades = 0
                    THEN 'SETENTA ' || lcCadena
                    WHEN lnDecenas = 7
                    AND lnUnidades <> 0
                    THEN 'SETENTA Y ' || lcCadena
                    WHEN lnDecenas = 8
                    AND lnUnidades = 0
                    THEN 'OCHENTA ' || lcCadena
                    WHEN lnDecenas = 8
                    AND lnUnidades <> 0
                    THEN 'OCHENTA Y ' || lcCadena
                    WHEN lnDecenas = 9
                    AND lnUnidades = 0
                    THEN 'NOVENTA ' || lcCadena
                    WHEN lnDecenas = 9
                    AND lnUnidades <> 0
                    THEN 'NOVENTA Y ' || lcCadena
                    ELSE lcCadena
                END
            INTO
                lcCadena;

            /* DECENAS */
            -- Analizo las centenas
            SELECT
                CASE
                        /* CENTENAS */
                    WHEN lnCentenas = 1
                    AND lnUnidades = 0
                    AND lnDecenas = 0
                    THEN 'CIEN ' || lcCadena
                    WHEN lnCentenas = 1
                    AND NOT
                        (
                            lnUnidades = 0
                        AND lnDecenas = 0
                        )
                    THEN 'CIENTO ' || lcCadena
                    WHEN lnCentenas = 2
                    THEN 'DOSCIENTOS ' || lcCadena
                    WHEN lnCentenas = 3
                    THEN 'TRESCIENTOS ' || lcCadena
                    WHEN lnCentenas = 4
                    THEN 'CUATROCIENTOS ' || lcCadena
                    WHEN lnCentenas = 5
                    THEN 'QUINIENTOS ' || lcCadena
                    WHEN lnCentenas = 6
                    THEN 'SEISCIENTOS ' || lcCadena
                    WHEN lnCentenas = 7
                    THEN 'SETECIENTOS ' || lcCadena
                    WHEN lnCentenas = 8
                    THEN 'OCHOCIENTOS ' || lcCadena
                    WHEN lnCentenas = 9
                    THEN 'NOVECIENTOS ' || lcCadena
                    ELSE lcCadena
                END
            INTO
                lcCadena;

            /* CENTENAS */
            -- Analizo la terna
            SELECT
                CASE
                        /* TERNA */
                    WHEN lnTerna = 1
                    THEN lcCadena
                    WHEN lnTerna = 2
                    AND
                        (
                            lnUnidades + lnDecenas + lnCentenas <> 0
                        )
                    THEN lcCadena || ' MIL '
                    WHEN lnTerna = 3
                    AND
                        (
                            lnUnidades + lnDecenas + lnCentenas <> 0
                        )
                    AND lnUnidades = 1
                    AND lnDecenas = 0
                    AND lnCentenas = 0
                    THEN lcCadena || ' MILLON '
                    WHEN lnTerna = 3
                    AND
                        (
                            lnUnidades + lnDecenas + lnCentenas <> 0
                        )
                    AND NOT
                        (
                            lnUnidades = 1
                        AND lnDecenas = 0
                        AND lnCentenas = 0
                        )
                    THEN lcCadena || ' MILLONES '
                    WHEN lnTerna = 4
                    AND
                        (
                            lnUnidades + lnDecenas + lnCentenas <> 0
                        )
                    THEN lcCadena || ' MIL MILLONES '
                    ELSE ''
                END
            INTO
                lcCadena;

            /* TERNA */
            --Retornamos los Valores Obtenidos
            lcRetorno = lcCadena || lcRetorno;
            lnTerna = lnTerna + 1;
        END LOOP;
    END IF;
    IF lnTerna = 1 THEN
        lcRetorno := 'CERO';
    END IF;
    lcRetorno := RTRIM(lcRetorno) || ' ' || LPAD(LTRIM(CAST(lnFraccion AS VARCHAR)), 2, '0') || '/100';
    RETURN lcRetorno;
END;
$dbvis$ LANGUAGE plpgsql
/*
27	1	00027	FORMAS DE ABONO	00001
28	1	00028	EFECTIVO	00027
29	1	00029	CHEQUE	00027
30	1	00030	TARJETA DE CREDITO	00027
*/